/**
* Oxide
*
* Copyright (c) 2011 Dinosaur Kick Pty Ltd, All rights reserved.
*
* This source code is made available under the "Modified BSD" licensing arrangement.
* See license.txt for details.
*/
// ----------------------------------------------------------------------------
#include <string>
#include <vector>
#include <map>
#include <boost/shared_ptr.hpp>
#include <boost/preprocessor.hpp>
// ----------------------------------------------------------------------------
#ifndef O2_AST_AST_FWD_INC
#define O2_AST_AST_FWD_INC
namespace o2 {
namespace ast {
// ----------------------------------------------------------------------------

#define O2_AST_CONCRETE_NODE_TYPES \
	(binary_oper) \
	(call_expr) \
	(class_decl) \
	(fixed_literal) \
	(float_literal) \
	(identifier) \
	(integer_literal) \
	(member_var) \
	(method) \
	(root) \
	(stmt_block) \
	(string_literal) \
	(unary_oper)

#define O2_AST_ABSTRACT_NODE_TYPES \
	(class_member) \
	(expr) \
	(stmt)

#define O2_AST_NODE_TYPES \
	O2_AST_CONCRETE_NODE_TYPES \
	O2_AST_ABSTRACT_NODE_TYPES

#define O2_AST_TYPEDEF_ITER(s, string_t, name) \
	typedef ::o2::ast:: BOOST_PP_CAT(basic_, name) <string_t> BOOST_PP_CAT(name, _type); \
	typedef ::boost::shared_ptr< BOOST_PP_CAT(name, _type) > BOOST_PP_CAT(name, _ptr); \
	typedef ::std::vector< BOOST_PP_CAT(name, _ptr) > BOOST_PP_CAT(name, _list); \
	typedef ::std::map<string_t, BOOST_PP_CAT(name, _ptr) > BOOST_PP_CAT(name, _map);

#define O2_AST_TYPEDEFS(string_t) \
	typedef ::std::vector<string_t> string_list; \
	BOOST_PP_SEQ_FOR_EACH(O2_AST_TYPEDEF_ITER, string_t, O2_AST_NODE_TYPES)

#define O2_AST_FWD_DECL_ITER(s, data, name) \
	template <typename StringT> struct BOOST_PP_CAT(basic_, name);

BOOST_PP_SEQ_FOR_EACH(O2_AST_FWD_DECL_ITER, string_t, O2_AST_NODE_TYPES);

// ----------------------------------------------------------------------------
} // namespace ast
} // namespace o2
#endif // O2_AST_AST_FWD_INC
// ----------------------------------------------------------------------------
